#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
//线程概念部分初识
//void* thread_run(void* args)
//{
//    const char* id = (const char*)args;
//    while(1){
//        printf("I am %s thread, %d\n", id, getpid());
//        sleep(1);
//    }
//}
//
//int main()
//{
//    pthread_t tid;
//    pthread_create(&tid, NULL, thread_run, (void*)"thread 1");
//    while(1){
//        printf("I am mian thread, %d\n",getpid());
//        sleep(1);
//    }
//    return 0;
//}

//void* thread_run(void* args)
//{
//    while(1){//新线程打印自己的ID
//        printf("我是新线程[%s]，我线程ID是：%lu\n", (const char*)args, pthread_self());
//        sleep(1);
//    }
//}
//int main()
//{
//    pthread_t tid;
//    pthread_create(&tid, NULL, thread_run, (void*)"new thread");
//    while(1){//主线程先是创建新线程并打印新线程的ID
//        printf("我是主线程，我创建的线程ID是：%lu, 我的线程ID是：%lu\n", tid, pthread_self());
//        sleep(1);
//    }
//}


//创建多个线程
//void* thread_run(void* args)
//{
//    while(1){
//        sleep(1);
//    }
//}
//
//int main()
//{
//    pthread_t tid[5];
//    for(int i = 0; i < 5; i++){
//        pthread_create(tid + i, NULL, thread_run, (void*)"new thread");
//    }
//
//    while(1){
//        printf("I am main thread ID, %lu\n",pthread_self());
//        printf("################# begin ################\n");
//        for(int i = 0; i < 5; i++){
//              printf("I creat thread [%d] is: %lu\n", i, tid[i]);
//        }
//        printf("#################  end #################\n");
//        sleep(1);
//    }
//    return 0;
//}

//线程健壮问题：一个线程的崩溃会导致所以的线程乃至整个进程的崩溃
//void* thread_run(void* args)
//{
//    int num = *(int*)args;
//    int n = 3;
//    while(n--){
//        printf("I am new thread [%d], I creat thread ID: %lu\n", num, pthread_self());
//        sleep(1);
//        //设置一个野指针问题
//        if(num == 3){
//            printf("thread number: %d\n quit", num);
//            int* p = NULL;
//            *p = 100;
//        }
//    }
//    return (void*)111;
//}
//
//int main()
//{
//    pthread_t tid[5];
//    for(int i = 0; i < 5; i++){
//        pthread_create(tid + i, NULL, thread_run, (void*)&i);
// 
//   }
//
//    void* status = NULL;
//    for(int i = 0; i < 5; i++)
//    {
//        pthread_join(tid[i], &status);
//        printf("tid[%d]: %d\n", i, (int)status);
//    }
////    while(1){
////        printf("I am main thread ID, %lu\n",pthread_self());
////        printf("################# begin ################\n");
////        for(int i = 0; i < 5; i++){
////              printf("I creat thread [%d] is: %lu\n", i, tid[i]);
////        }
////        printf("#################  end #################\n");
////        sleep(1);
////    }
//    return 0;
//}

//线程的等待
//#define NUM 1
//void* thread_run(void* args)
//{
//    int num = *(int*)args;
//    while(1){
//        printf("I am new thread [%d], I creat thread ID: %lu\n", num, pthread_self());
//        sleep(3);
//        break;
//    }
//    return (void*)111;
//}
//
//int main()
//{
//    pthread_t tid[NUM];
//    for(int i = 0; i < NUM; i++){
//        pthread_create(tid + i, NULL, thread_run, (void*)&i);
//        sleep(1);
//    }
//
//    void* status = NULL;
//    pthread_join(tid[0], &status);
//
//    printf("ret: %d\n", (int)status);
//    return 0;
//}

//线程终止
//#define NUM 5
//void* thread_run(void* args)
//{
//    int num = *(int*)args;
//    while(1){
//        printf("I am new thread [%d], I creat thread ID: %lu\n", num, pthread_self());
//        sleep(3);
//        break;
//    }
//    exit(111);
//   // pthread_exit((void*)111);
//}
//
//int main()
//{
//    pthread_t tid[NUM];
//    for(int i = 0; i < NUM; i++){
//        pthread_create(tid + i, NULL, thread_run, (void*)&i);
//        sleep(1);
//    }
//
//    void* status = NULL;
//    for(int i = 0; i < NUM; i++){
//        pthread_join(tid[i], &status);
//        printf("I am thread[%d], I am code: %d\n",i ,(int)status);
//    }
//   while(1){  
//      printf("I am main thread\n");
//      sleep(1);
//    }
//    return 0;
//}

//取消线程
//pthread_t g_tid;
//void* thread_run(void* args)
//{
//    while(1){
//        printf("I am new thread [%s], I creat thread ID: %lu\n", (const char*)args, pthread_self());
//        sleep(2);
//        pthread_cancel(g_tid);
//    }
//}
//
//int main()
//{
//    g_tid = pthread_self();
//    pthread_t tid;
//    pthread_create(&tid, NULL, thread_run, (void*)"thread 1");
//    sleep(60);
//    //sleep(3); 
//    //printf("wait new thread...\n");
//    //sleep(5);
//    //printf("cancel wait new thread...\n");
//    //sleep(3); 
//    //pthread_cancel(tid);
//    
//    void* status = NULL;
//    pthread_join(tid, &status);
//    printf("I am thread: %d, I am code: %d\n",tid ,(int)status);
//    return 0;
//}

//分离线程

//void* thread_run(void* args)
//{
//    pthread_detach(pthread_self());
//    while(1){
//        printf("I am new thread [%s], I creat thread ID: %lu\n", (const char*)args, pthread_self());
//        sleep(2);
//        break;
//    }
//    return (void*)111;
//}
//
//int main()
//{
//    pthread_t tid;
//    int ret = 0;
//    pthread_create(&tid, NULL, thread_run, (void*)"thread 1");
//    sleep(1);
//    
//    void* status = NULL;
//    ret = pthread_join(tid, &status);
//    printf("ret: %d, status: %d\n",ret ,(int)status);
//    sleep(3);
//    return 0;
//}
